package com.utils;

import java.util.HashMap;
import java.util.Map;

/***
 * 统一返回类型
 * 继承自 HashMap，使得 R 对象可以作为键值对存储响应数据
 */
public class R extends HashMap<String, Object> {
    // 序列化版本UID，用于保持兼容性
    private static final long serialVersionUID = 1L;

    // 常量定义，用于在返回数据中存储状态码、消息和数据
    private static final String CODE_KEY = "code";
    private static final String MESSAGE_KEY = "message";
    private static final String DATA_KEY = "data";

    /**
     * 私有构造函数，通过静态方法创建实例
     * @param code 状态码
     * @param message 消息
     * @param data 返回的数据
     */
    private R(int code, String message, Object data) {
        put(CODE_KEY, code);  // 存储状态码
        put(MESSAGE_KEY, message);  // 存储消息
        if (data != null) {
            put(DATA_KEY, data);  // 如果数据不为 null，则存储数据
        }
    }

    // 成功响应的方法
    /**
     * 返回默认成功响应
     * @return R 对象
     */
    public static R success() {
        return success("Success", null);
    }

    /**
     * 返回带消息的成功响应
     * @param message 消息
     * @return R 对象
     */
    public static R success(String message) {
        return success(message, null);
    }

    /**
     * 返回带数据的成功响应
     * @param data 数据
     * @return R 对象
     */
    public static R success(Object data) {
        return success("Success", data);
    }

    /**
     * 返回带消息和数据的成功响应
     * @param message 消息
     * @param data 数据
     * @return R 对象
     */
    public static R success(String message, Object data) {
        return new R(200, message, data);  // 200 表示成功的状态码
    }

    // 错误响应的方法
    /**
     * 返回默认错误响应
     * @return R 对象
     */
    public static R error() {
        return error(500, "Unknown error, please contact the administrator");
    }

    /**
     * 返回带消息的错误响应
     * @param message 消息
     * @return R 对象
     */
    public static R error(String message) {
        return error(500, message);
    }

    /**
     * 返回带状态码和消息的错误响应
     * @param code 状态码
     * @param message 消息
     * @return R 对象
     */
    public static R error(int code, String message) {
        return new R(code, message, null);  // 错误响应通常不包含数据
    }

    /**
     * 链式调用添加数据
     * @param key 键
     * @param value 值
     * @return R 对象
     */
    public R data(String key, Object value) {
        put(key, value);
        return this;
    }

    @Override
    public Object put(String key, Object value) {
        return super.put(key, value);
    }
}
